// 引入了express模块
let express = require("express")();
let url = require('url');
let fs = require('fs');
let mysql = require('mysql');
let expressStatic = require('express-static');
const port = 80;

// 数据库的配置，做计划
var sql = mysql.createConnection({
	// 别改 
	host     : 'localhost',
	user     : 'root',
	password : '123456',
	database : 'school'
});

// 尝试链接
sql.connect();

// 配置首页文件
express.get("/",(request,response)=>{
	fs.readFile("static/index.html",(error,data)=>{
		if(error){
			response.end("error");
			console.log("找不到首页文件了")
		}
		else{
			response.end(data);
		}
	})
})

// 【1】插入表格 计划一个服务于客户端的接口
express.get("/getData",(request,response)=>{

	// 查库
	sql.query(`SELECT * FROM students`,(error,data)=>{
		if(error){
			response.end("database error");
			console.log("数据库查找失败了")
		}
		else{
			// 反解析后向前端返回JSON字符串
			response.end(JSON.stringify(data))
		}
	})
})



//【2】删除模块
express.get("/delete",(request,response)=>{

	let id = url.parse(request.url,true).query.id;

	if(id === undefined){
		response.end("请发送要删除的学员id")
	}
	else{

		sql.query(`DELETE FROM students WHERE id=${id}`,(error,data)=>{
			if(error){
				response.end("database error");
				console.log("数据库删除失败了")
			}
			else{
				// 反解析后向前端返回JSON字符串
				response.end(`success`)
			}
		})
	}
})

// 【3】添加模块 计划一个服务于客户端的接口
express.get("/addData",(request,response)=>{

	// 返回本次来自前端请求附带参数列表的对象形式
	let name = url.parse(request.url,true).query.name;
	let sex = url.parse(request.url,true).query.sex;
	let age = url.parse(request.url,true).query.age;
	let city = url.parse(request.url,true).query.city;

	// 查库
	sql.query(`INSERT INTO students (name,age,sex,city) VALUES ("${name}","${age}","${sex}","${city}") `,(error,data)=>{
		if(error){
			response.end("database error");
			console.log(`添加${name}数据失败了`)
		}
		else{
			// 反解析后向前端返回JSON字符串
			response.end("success");
		}
	})
})


//【4】修改信息模块
express.get("/change",(request,response)=>{

	// 返回本次来自前端请求附带参数列表的对象形式
	let id = url.parse(request.url,true).query.id;
	let name = url.parse(request.url,true).query.name;
	let sex = url.parse(request.url,true).query.sex;
	let age = url.parse(request.url,true).query.age;
	let city = url.parse(request.url,true).query.city;
	
	if(id === undefined){
		response.end("请发送要修改的学员id")
	}
	else{
		// 查库 注意写法
		sql.query(`UPDATE students SET name='${name}',age='${age}',sex='${sex}',city='${city}' WHERE id=${id}`,(error,data)=>{
			if(error){
				response.end("database error");
				console.log(`修改${name}数据失败了`)
			}
			else{
				// 反解析后向前端返回JSON字符串
				response.end(`success`)
			}
		})
	}
})


// 【5】注册用户
express.get("/register",(request,response)=>{
	// 返回本次来自前端请求附带参数列表的对象形式
	let username = url.parse(request.url,true).query.username;
	let password = url.parse(request.url,true).query.password;
	//5.1 如果用户名和密码都不为空，执行以下代码
	if(username && password){
		//【查库】在用户名和密码都不为空的情况下查看数据库下的users表中是否拥有该用户名
		sql.query(`SELECT * FROM users WHERE username="${username}"`,(error,data)=>{
			//5.2 如果数据库中已经存在该用户名则向前端返回`repeat`
			if(data.length){
				response.end(`repeat`);
			}
			//5.2 如果数据库中没有该用户名
			else{
				// 【增加】向数据库中写入新用户数据（用户名和密码）
				sql.query(`INSERT INTO users (username,password) VALUES ("${username}","${password}")`,(error,data)=>{
					//5.3 如果增添失败向前端返回error,并且在后端输出error
					if(error){
						response.end("database error");
						console.log(error)
					}
					//5.3 如果增添成功向前端返回`success`
					else{
						// 反解析后向前端返回JSON字符串
						response.end(`success`)
					}
				})
			}
		})
	}
	//5.1 如果用户名和密码至少有一个为空，则直接向前端返回错误【error】
	else{
		response.end("error")
	}
})

// 【6】用户登录
express.get("/login",(request,response)=>{
	// 返回本次来自前端请求附带参数列表的对象形式
	let username = url.parse(request.url,true).query.username;
	let password = url.parse(request.url,true).query.password;
	//5.1 如果用户名和密码都不为空，执行以下代码
	if(username && password){
		//【查库】在用户名和密码都不为空的情况下查看数据库下的users表中的用户名和密码是否与该用户输入的相一致
		sql.query(`SELECT * FROM users WHERE username="${username}" AND password="${password}"`,(error,data)=>{
			//如果用户名和密码正确则将其用户名转换成字符串的形式返回给前端，并在后端输出某某用户登录成功
			if(data.length){
				response.end(String(data[0].username))
				console.log(`用户：${data[0].username}登录成功。`)
			}
			//如果与数据库中的不一致则返回error
			else{
				response.end("error")
			}
		})
	}
	//5.1 如果用户名和密码至少有一个为空，则直接向前端返回错误【error】
	else{
		response.end("error")
	}
})


// 【静态访问】如果接收到来自前端的静态请求了，我应该去哪里（文件夹）找对应文件
express.use(expressStatic(`${__dirname}/static`))


//5.监听事件，接受number类型，一般把端口号放在上方[异步操作]
//开始监听来自前端的请求，也叫启动服务，该操作不会停止
express.listen(port,()=>{
	console.log(`server is running at ${port}`)
})